package oer.halk.intercept_demo.utils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.sql.rowset.serial.SerialBlob;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.Blob;

/**
 * @Author zhuhao
 * @Date 2022/1/24 13:51
 * @desc
 */
public class BaseImgDemo {


    public static void main(String[] args) throws Exception {
        String imgUrl = "http://211.93.251.21:8762/file/affix/download?filePath=/app/upload/editor/2022/1/23/282cd041f70f01aa03ac1c583ab8e6ed.jpg";
        String s = encodeImageToBase64(new URL(imgUrl));
        System.out.println(s);

//        GenerateImage(s, "D:/11.jpg");

        Blob b = new SerialBlob(s.getBytes("GBK"));//String 转 blob

        System.out.println(b);


    }

    /**
     * 将网络图片编码为base64
     *
     * @param url
     * @return *@throws BusinessException
     */
    public static String encodeImageToBase64(URL url) throws Exception {
        //打开链接
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) url.openConnection();
            //设置请求方式为"GET"
            conn.setRequestMethod("GET");
            //超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            //通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            //得到图片的二进制数据，以二进制封装得到数据，具有通用性
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度，如果为-1，代表全部读取完毕
            int len = 0;
            //使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            //关闭输入流
            inStream.close();
            byte[] data = outStream.toByteArray();
            //对字节数组Base64编码
            BASE64Encoder encoder = new BASE64Encoder();
            String base64 = encoder.encode(data);
            //返回Base64编码过的字节数组字符串
            return base64;
        } catch (IOException e) {
            e.printStackTrace();
            throw new Exception("图片上传失败,请联系客服!");
        }
    }


    /**
     * base64字符串转化成图片
     *
     * @param imgData
     * @param imgFilePath
     * @return
     * @throws IOException
     */
    @SuppressWarnings("finally")
    public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片
        // 图像数据为空
        if (imgData == null) {
            return false;
        }
        BASE64Decoder decoder = new BASE64Decoder();
        OutputStream out = null;
        try {
            out = new FileOutputStream(imgFilePath);
            // Base64解码
            byte[] b = decoder.decodeBuffer(imgData);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {// 调整异常数据
                    b[i] += 256;
                }
            }
            out.write(b);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
            return true;
        }
    }
}
